Seaborn-1

seaborn 简介

Seaborn是一种基于matplotlib的图形可视化python library。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。

Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。

应该把Seaborn视为matplotlib的补充,而不是替代物。 同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。掌握seaborn能很大程度帮助我们更高效的观察数据与图表,并且更加深入了解它们。

其有如下特点:

官方网站:http://seaborn.pydata.org 在接下来的一段时间内,我们将带大家深入地了解各类seaborn绘图函数。

使用散点图发现数据之间的关联

散点图是数据可视化中最常用的图像。它直观地向我们展示了数据之间的分布关系,如果数据之间存在线性或者其他相关关系,很容易通过散点图观察出来。

除了之前提到的plt.scatter(),使用seaborn也可以绘制散点图。对用的命令是scatterplot()

除此之外,我们还可以通过在 relplot()中指定kind="scatter"获取同样的效果。

相比于scatterplotrelplot的集成度更高,在使用方法上也更为方便。例如,如果我们想给散点图加上第三个维度,就直接可以通过一个参数hue进行传递即可。该参数将会给不同的类别赋以不同的颜色。

除此之外,我们还可以继续修改散点的形状,只需要引入style参数

结合huestyle两个参数,我们就可以实现四维数据的绘图。需要注意的是,人眼的形状的敏感性不如颜色,因此该方法应该慎用,因为第四个维度不容易被观察到。

在上面的案例中,hue参数接受到的是离散的类别数据,而如果我们给它传入一个数值形式的数据,那么relplot将会用连续变化的色谱来区分该数据。

当然了,除了散点的颜色的形状,我们还可以修改散点的大小,只需要指定size参数即可。

下面是一个综合使用以上参数,得到的一个五维的散点图。

数据的汇总和不确定性的展示

此外,不确定度还可以用标准差来衡量,只需要设置ci='sd'即可

如果我们关掉数据汇总,那么绘制出来的图像会非常奇怪。这是因为在某一个时间,会有多个测量数据。

绘制子数据集

scatterplot()一样,我们可以通过修改hue,style,size,来增加更多的绘图维度,用法也是非常一致的,这意味着我们可以非常简单地在两种方法之间进行替换。

例如,如果我们引入hue参数,对event进行分类。即可得到如下的数据汇总图。

我们继续加入另一个style参数,可以把region也考虑进去。

为了突出显示,我们还可以修改线型。

下面我们考虑另一个数据集

上面的例子我们用的是离散变量作为参数huechioce的值,实际上,他们也可以使用连续变量。比如下面的例子

请注意,当style的可能性增多时,肉眼可能不太能够区分不同的线型,因此该方法需要在变量取值范围较小的情况下使用。

使用多张图展示数据之间的相互关系

下面我们学习如何使用多张子图,分析与展示数据之间的相关性。使用的参数主要是col

此外,我们还可以通过row参数,进一步地扩大子图的规模

以上的一系列可视化方法,称为小倍数绘图( “lattice” plots or “small-multiples”),在研究大规模数据集的时候尤为重要,因为使用该方法,可以把复杂的数据根据一定的规律展示出来,并且借助可视化,使人的肉眼可以识别这种规律。

需要注意的是,有的时候,简单的图比复杂的图更能帮助我们发现和解决问题。

课堂练习

使用iris数据集,进行数据可视化。要求以sepal_length为横轴,以sepal_width为纵轴,以花的种类为颜色标准,绘制散点图。你可以使用如下的代码导入iris数据集。

绘制离散形式的变量

在上一节中,我们学习了如何使用relplot()描述数据集中多变量之间的关系,其中我们主要关心的是两个数值型变量之间的关系。本节我们进一步地,讨论离散型( categorical)变量的绘制方法。

在seaborn中,我们有很多可视化离散型随机变量的方法。类似于relplot()之于scatterplot()lineplot()的关系, 我们有一个catplot()方法,该方法提高了我们一个从更高层次调用各类函数的渠道,例如swarmplot(),boxplot(),violinplot()等。

在详细地学习这些方法之前,对他们做一个系统地分类是非常有必要的,他们按照绘制内容可以分成如下三类:

以上三个类别代表了绘图的不同角度,在实践中,我们要根据要解决的问题,合理地选择使用其中哪种方法。

如果不知道哪种方法比较好,可以都尝试一遍,选择可视化效果更好的一个。

在本教程中,我们主要使用catplot()函数进行绘图,如前所述,该函数是基于其他许多函数基础上一个更高层次的调用渠道。

因此如果有针对其中任何一种方法的疑问,都可以在对应的方法的详细介绍中找到解释。

首先,我们需要导入需要的库seabornmatplotlib.pyplot

分类散点图

catplot()中的默认绘图方法是scatterplot,在catplot()中。如果我们只有一个类别,那么散点图绘制的时候,许多数据点会重叠(overlap)在一起,数据区分度和美观性都不强。

为了解决这一问题,实际上有两类绘制散点图的方法。

方法一: 我们可以考虑采用stripplot(),该方法通过给每一个数据点一个在x轴上的小扰动,使得数据点不会过分重叠。stripplot()catplot()的默认参数。

我们可以吧jitter参数关掉,观察一下效果。

方法二: 使用swarmplot(),该方法通过特定算法将数据点在横轴上分隔开,进一步提高区分度,防止重叠。该方法对于小数据集尤其适用,调用该方法只需要在catplot()中指定参数kind="swarm"即可。

类似于relplot(),catplot()也可以通过添加颜色进一步增加绘图的维度,对应的参数为hue。需要注意的是,catplot()暂时不支持sytlesize参数。

不像数值型的数据,有的时候,我们对于离散型的类别数据很难得到一个排序的标准。当然,seaborn会尽可能地按照合理的方法给他们排序,如果需要的话也可以人为指定排序。

当我们想要指定绘制顺序的时候,可以使用order参数。

有的时候,我们想要把散点图横着画,尤其是在类别比较多的时候,这时我们可以对调xy参数,达到该效果。

课堂练习:

使用上面的方法,对tips数据集进行分析,绘制一个吸烟和吃饭时间(午饭or晚饭)与tip的关系图。你可以自定x,y轴和染色方法。

分类分布统计图

如前所述,类别形式的散点图受限于数据集的大小,当数据量很大时,即使是使用swarmplot或者stripplot也无法使数据点分开。此时,我们考虑使用基于数据分布的绘图方法,而不再采用散点图。

Boxplots

Image Name

箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。

箱线图似乎是原始的,但它们具有占用较少空间的优势,这在比较许多组或数据集之间的分布时非常有用。

箱线图是一种基于五位数摘要(“最小”,第一四分位数(Q1),中位数,第三四分位数(Q3)和“最大”)显示数据分布的标准化方法。

基于分布的绘图方法中最简单的就是箱线图了,关于箱线图的理论已经在之前的讲义中进行了介绍,这里不再展开。箱线图的调用方法也很简单,直接kind = "box"就行。

当然了,我们还可以加入hue参数,增加数据的绘图维度。

有一个和箱线图很像的图,叫boxenplot(),它会绘制一个跟箱线图很像的图片,但是展示了更多箱线图无法展示的信息,尤其适用于数据集比较大的情况。

Violinplots

接下来我们看小提琴图violinplot(),它结合了箱线图核密度估计的思想

该方法用到了kernel density estimate (KDE),进而提供了更为丰富的数据分布信息。另一方面,由于KDE的引入,该方法也有更多的参数可以修改,例如bw.cut

此外,如果数据的hue参数只有两个类别,一种非常高效的方法是给定split=True,仅绘制具有对称性的图像的一半。

当然了,小提琴图的内部绘制也可以修改,如果我们想要展示原始数据点而不是分位数等统计数据,我们可以指定inner="stick",那么所有的原始数据点会被绘制在图中。

我们还可以把swarmplot()或者striplot()放置在boxplot或者violinplot中,从而实现总体与局部的整体展示。

参考资料